//解码字母到整数映射
/*给你一个字符串 s，它由数字（'0' - '9'）和 '#' 组成。我们希望按下述规则将 s 映射为一些小写英文字符：

字符（'a' - 'i'）分别用（'1' - '9'）表示。
字符（'j' - 'z'）分别用（'10#' - '26#'）表示。 
返回映射之后形成的新字符串。

题目数据保证映射始终唯一。*/
class Solution {
public:
    string freqAlphabets(string s) {
        char _a = 'a' - 1;
        string ret;
        for (int i = s.size() - 1; i >= 0; i--) {
            int temp;
            if (s[i] >= '0' && s[i] <= '9') {
                temp = s[i] - '0';
                ret.push_back(temp + _a);
            } else {
                temp = (s[i - 1] - '0') + (s[i - 2] - '0') * 10;
                i -= 2;
                ret.push_back(temp + _a);
            }
        }
        reverse(ret.begin(), ret.end());
        return ret;
    }
};


//根据数字二进制下 1 的数目排序
/*给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。

如果存在多个数字二进制中 1 的数目相同，则必须将它们按照数值大小升序排列。

请你返回排序后的数组。

 */
 int count_one(int a) {
    int count = 0;
    while (a) {
        a = a & (a - 1);
        count++;
    }
    return count;
}
struct compare {
    bool operator()(int& x, int& y) {
        int count_x = count_one(x);
        int count_y = count_one(y);
        if (count_x != count_y) {
            return count_x < count_y;
        } else
            return x < y;
    }
};
class Solution {

public:
    vector<int> sortByBits(vector<int>& arr) {
        sort(arr.begin(), arr.end(), compare());
        return arr;
    }
};